Send / SendRaw / SendInput / SendPlay / SendEvent: 发送按键和点击


发送模拟的键击和鼠标点击到 激活的 窗口。

Send Keys
SendRaw Keys
SendInput Keys
SendPlay Keys
SendEvent Keys

参数

Keys 一连串要发送的按键。和其他命令一起用时,在第一个参数前面的逗号是可选的。

Raw 模式:  SendRaw 命令准确地按照键击本身显示的那样发送,而不是把 {Enter} 转换成一个 ENTER 键击,^c 转换成 Control-C 键击等等。要和 SendInput, SendPlay 或 SendEvent 命令一起使用 raw 模式,将 {Raw} 写在字串的首位;例如: SendInput {Raw}abc

普通模式: 当不用 raw 模式时,下面的字符被当作修饰键 (这些修饰键仅影响紧跟着的下一个按键):

!: 发送一个 ALT 键击。例如,Send This is text!a 将发送按键 "This is text" 并且之后按下 ALT+a 。注意: !A 在某些程序里会和 !a 产生不同的效果。这是因为 !A 按了 ALT+SHIFT+A 而 !a 按了 ALT+a 。如果有疑虑,使用小写。

+: 发送一个 SHIFT 键击。例如,Send +abC 将发送文本 "AbC" ,而 Send !+a 将按下 ALT+SHIFT+a 。

^: 发送一个 CONTROL 键击。例如,Send ^!a 将按下 CTRL+ALT+a ,而 Send ^{Home} 将发送 CONTROL+HOME 。注意: ^A 在某些程序里会和 ^a 产生不同的效果。这是因为 ^A 按了 CONTROL+SHIFT+A 而 ^a 按了 CONTROL+a 。如果有疑虑,使用小写。

#: 发送一个 WIN 键击,因此 Send #e 将按住 Windows 键并在之后按下字母 "e" 。


SendInput 和 SendPlay [v1.0.43+]: SendInput 和 SendPlay 与 Send 命令使用相同的语法但是通常更快更可靠。此外,它们在发送期间缓存了任何物理的键盘或鼠标活动,这样就防止在发送时夹杂用户的键击。SendMode 可以用来使 Send 命令和 SendInput 或 SendPlay 具有同样的功能。要知道每个模式更详细的内容,请看下面的 SendInput 和 SendPlay 。

SendEvent [v1.0.43+]: SendEvent 和 1.0.43 版本之前的 Send 命令使用同样的方法发送键击。键击被发送时的频率由 SetKeyDelay 来决定。默认,Send 和 SendEvent 是一样的;但它能通过 SendMode 变得和 SendInput 或 SendPlay 一样。

Key 的名称: 下面的表格列出了能被发送的特殊按键 (每个按键名称都必须用大括号围住):

Key 的名称 生成的键击
{F1} - {F24} 功能键。例如:{F12} 是 F12 键。
{!} !
{#} #
{+} +
{^} ^
{{} {
{}} }
{Enter} 在主键盘上的 ENTER 键
{Escape} 或 {Esc} ESCAPE 键
{Space} SPACE 键(它仅需要在发送的字符串的开头或结尾出现 -- 在中间那些可能成为原义的 space)
{Tab} TAB 键
{Backspace} 或 {BS} Backspace 键
{Delete} 或 {Del} Delete 键
{Insert} 或 {Ins} Insert 键
{Up} 主键盘上的向上的箭头键
{Down} 主键盘上的向下的箭头键
{Left} 主键盘上的向左的箭头键
{Right} 主键盘上的向右的箭头键
{Home} 主键盘上的Home 键
{End} 主键盘上的End 键
{PgUp} 主键盘上的Page-up 键
{PgDn} 主键盘上的Page-down 键
   
{CapsLock} CapsLock 键 (在 NT/2k/XP 上使用 SetCapsLockState 更可靠)
{ScrollLock} ScrollLock 键 (同样请看: SetScrollLockState)
{NumLock} NumLock 键 (同样请看: SetNumLockState)
   
{Control} 或 {Ctrl} CONTROL 键 (技术信息: 发送中性的而不是左边的虚拟按键扫描代码)
{LControl} 或 {LCtrl} 左 CONTROL 键 (技术信息: 对 Win9x 来说和 CONTROL 一样,但在 NT/2k/XP 上它发送左边的虚拟按键而不是中性的按键)
{RControl} 或 {RCtrl} 右 CONTROL 键
{Control Down} 或 {Ctrl Down} 按住 CONTROL 键直到发送 {Ctrl Up} 。XP/2000/NT: 要按住左边或右边的键,请用 {RCtrl Down} 和 {RCtrl Up} 。
   
{Alt} ALT (技术信息: 发送中性的而不是左边的虚拟按键扫描代码)
{LAlt} 左 ALT 键 (技术信息: 对 Win9x 来说和 ALT 一样,但在 NT/2k/XP 上它发送左边的虚拟按键而不是中性的按键)
{RAlt} 右 ALT 键 (或 AltGr ,取决于键盘布局)
{Alt Down} 按住 ALT 键直到发送 {Alt Up} 。XP/2000/NT: 要按住左边或右边的键,请用 {RAlt Down} 和 {RAlt Up} 。
   
{Shift} SHIFT 键 (技术信息: 发送中性的而不是左边的虚拟按键扫描代码)
{LShift} 左 SHIFT 键 (技术信息: 对 Win9x 来说和 SHIFT 一样,但在 NT/2k/XP 上它发送左边的虚拟按键而不是中性的按键)
{RShift} 右 SHIFT 键
{Shift Down} 按住 SHIFT 键直到发送 {Shift Up} 。XP/2000/NT: 要按住左边或右边的键,请用 {RShift Down} 和 {RShift Up} 。
   
{LWin} 左 Windows 键
{RWin} 右 Windows 键
{LWin Down} 按住左 Windows 键直到发送 {LWin Up}
{RWin Down} 按住右 Windows 键直到发送 {RWin Up}
   
{AppsKey} Windows App 键 (调用右键点击或上下文菜单)
{Sleep} 电脑 SLEEP 键。
{ASC nnnnn}

发送一个 ALT+nnnnn 数字小键盘组合,它能用来创建在键盘上不存在的特殊字符。要创建 ASCII 字符,指定一个在 1 和 255 之间的数字。要创建 ANSI 字符 (多数规范语言),指定一个在 128 和 255 之间的数字,但在它前面用一个零开头,例如 {Asc 0133} 。

要创建 Unicode 字符,指定一个在 256 和 65535 之间的数字(不用零开头)。不过,它不是所有的应用程序都支持。因此,为了更可靠和更简便地发送长的 Unicode 字符串,请用 "Transform Unicode" 。

{vkXX}
{scYYY}
{vkXXscYYY}

发送一个有虚拟按键 XX 和扫描代码 YYY 的键击。例如:Send {vkFFsc159} 。如果省略 sc 或 vk 部分,会就地发送最适当的值。

XX 和 YYY 的值是十六进制的并且能从主窗口的 View->Key history 菜单项来确定。请看:特殊按键

   
{Numpad0} - {Numpad9} 数字小键盘的数字键 (当 Numlock 显示是 ON 的状态时)。例如:{Numpad5} 是数字 5 。
{NumpadDot} 数字小键盘的点 (当 Numlock 显示是 ON 的状态时) 。
{NumpadEnter} 在数字小键盘上的 Enter 键
{NumpadMult} 在数字小键盘上的乘号键
{NumpadDiv} 在数字小键盘上的除号键
{NumpadAdd} 在数字小键盘上的加号键
{NumpadSub} 在数字小键盘上的减号键
   
{NumpadDel} 在数字小键盘上的 Delete 键 (此键和下面的数字小键盘按键在 Numlock 是 OFF 状态时使用)
{NumpadIns} 在数字小键盘上的 Insert 键
{NumpadClear} 在数字小键盘上的 Clear 键 (在 Numlock 是 OFF 状态时通常是 '5' 键)。
{NumpadUp} 在数字小键盘上的向上的箭头键
{NumpadDown} 在数字小键盘上的向下的箭头键
{NumpadLeft} 在数字小键盘上的向左的箭头键
{NumpadRight} 在数字小键盘上的向右的箭头键
{NumpadHome} 在数字小键盘上的 Home 键
{NumpadEnd} 在数字小键盘上的 End 键
{NumpadPgUp} 在数字小键盘上的 Page-up 键
{NumpadPgDn} 在数字小键盘上的 Page-down 键
   
{Browser_Back} 2000/XP/Vista+: 选择浏览器的 "后退" 按钮
{Browser_Forward} 2000/XP/Vista+: 选择浏览器的 "前进" 按钮
{Browser_Refresh} 2000/XP/Vista+: 选择浏览器的 "刷新" 按钮
{Browser_Stop} 2000/XP/Vista+: 选择浏览器的 "停止" 按钮
{Browser_Search} 2000/XP/Vista+: 选择浏览器的 "搜索" 按钮
{Browser_Favorites} 2000/XP/Vista+: 选择浏览器的 "收藏" 按钮
{Browser_Home} 2000/XP/Vista+: 启动浏览器并转到主页
{Volume_Mute} 2000/XP/Vista+: 总音量静音/取消静音。通常相当于 SoundSet, +1, , mute
{Volume_Down} 2000/XP/Vista+: 降低总音量。通常相当于 SoundSet -5
{Volume_Up} 2000/XP/Vista+: 增加总音量。通常相当于 SoundSet +5
{Media_Next} 2000/XP/Vista+: 在 media player 选择下一首
{Media_Prev} 2000/XP/Vista+: 在 media player 选择前一首
{Media_Stop} 2000/XP/Vista+: 停止 media player
{Media_Play_Pause} 2000/XP/Vista+: 播放/暂停 media player
{Launch_Mail} 2000/XP/Vista+: 启动 email 的应用程序
{Launch_Media} 2000/XP/Vista+: 启动 media player
{Launch_App1} 2000/XP/Vista+: 启动用户的程序1
{Launch_App2} 2000/XP/Vista+: 启动用户的程序2
   
{PrintScreen} Print Screen 键
{CtrlBreak} Ctrl+break
{Pause} Pause 键
   
{Click [Options]}
[v1.0.43+]
发送一个鼠标点击,使用在 Click 命令 中相同的可用选项。例如,{Click} 会在当前的鼠标指针位置点击鼠标左键一次,而 {Click 100, 200} 会在坐标 100, 200 处点击 (基于 CoordMode)。要移动鼠标而不是点击,在坐标后面指定 0 ;例如:{Click 100, 200, 0} 。在鼠标点击之间的延迟由 SetMouseDelay 命令决定(不是 SetKeyDelay) 。
{WheelDown}, {WheelUp},{WheelLeft}, {WheelRight}, {LButton}, {RButton}, {MButton}, {XButton1}, {XButton2} 在指针当前的位置发送一个鼠标按键事件 (要控制位置和其他选项,请用上面的 {Click} )。在鼠标点击之间的延迟由 SetMouseDelay 决定。WheelLeft/Right 需要 v1.0.48+,不过Windows Vista以上不需要。
{Blind}

当 {Blind} 在字符串的首位,如果 Alt/Control/Shift/Win 键在开始时是按下的位置,程序会避免松开它们。例如,热键 +s::Send {Blind}abc 会发送 ABC 而不是 abc 因为用户是按住了 Shift 键。

{Blind} 也导致 SetStoreCapslockMode 被忽略;也就是说,Capslock 键的状态不变。最后,{Blind} 忽略附加的控制键击被发送;这样的键击防止:1) 开始菜单出现在 LWin/RWin 键击期间; 2) 菜单栏在 Alt 键击期间被激活。

Blind 模式当 重映射一个按键 时被用在其中。例如,重映射 a::b 会产生:1) "b" 当你键入 "a" 时; 2) 大写 B 当你键入大写 A 时; 3) Control-B 当你键入 Control-A 时。

{Blind} 不被 SendRaw 和 ControlSendRaw 支持。此外,它不被 SendPlay 完全地支持,特别在处理修饰键(Control, Alt, Shift 和 Win) 时。

{Raw}
[v1.0.43+]
准确地按照键击本身显示的那样发送,而不是把 {Enter} 转换成一个 ENTER 键击,^c 转换成 Control-C 键击等等。不过字串  {Raw} 不需要出现在字符串的开头部分,一旦指定,它将持续影响字符串的剩余部分。

按住或重复一个按键

要重复一个键击: 将按键名称后跟要重复次数的数字括入大括号。例如:

Send {DEL 4}  ; 按 4 次 Delete 键。
Send {S 30}   ; 发送大写 S 字符 30 次。
Send +{TAB 4}  ; 按 4 次 Shift-Tab 。

要按住或松开一个按键: 将按键名称后跟单词 Down 或 Up 括入大括号。例如:

Send {b down}{b up}
Send {TAB down}{TAB up}
Send {Up down} ; 按下向上的箭头键 Sleep 1000 ; 将它按住 1 秒。 Send {Up up} ; 松开向上的箭头键。

当一个按键通过上面的方法被按住,它不会开始自动重复像你物理地按住它那样 (这是因为自动重复是一种驱动/硬件的特性)。不过,一个 Loop 可被用来模拟自动重复。下面的例子发送了 20 次 tab 键击:

Loop 20
{
Send {Tab down} ; 自动重复由连续的按下事件组成 (没用松开事件) 。 Sleep 30 ; 在键击之间的毫秒数值 (或使用 SetKeyDelay) 。 } Send {Tab up} ; 松开按键。

单词 DownTemp 也可以被使用。它的效果和 Down 一样除了修饰键外 (Control/Shift/Alt/Win)。在那些情况下,DownTemp 告诉后面的发送,此键不是永远按下,并可能随时在一个键击调用它时松开。例如,Send {Control DownTemp} 之后跟上 Send a 会产生一个正常的 "a" 键击,不是一个 control-A 键击。

一般说明

除了从字母 A 到 Z 外,下面的字母和符号也同样支持 (不过,如果你的操作系统的代码页是某些 1252 [US & Western Europe] 之外的东西的话,这个列表可能会不一样):
�?‚ƒ„…†‡ˆ‰Š‹Œ?Ž??‘’“”•–—˜™š›œ?žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

BlockInput 与 SendInput/SendPlay 相比: 虽然 BlockInput 命令能用来防止用户输入的任何物理键击来扰乱模拟键击流程,但最好使用 SendInput 或 SendPlay 以便键击和鼠标点击变得不可中断。这是因为不像 BlockInput,SendInput/Play 不抛弃在发送期间用户输入的内容;取而代之的是,这样的键击被缓存起来并在之后发送。

当发送大量的键击时,一个 continuation section(连续章节) 能用来改善可读性和可维护性。

由于操作系统不允许模拟 CTRL-ALT-DELETE 组合,像 Send ^!{Delete} 将不产生效果。

SendInput [v1.0.43+]

SendInput 通常是更被喜欢用来发送键击和鼠标点击的方法因为它的优良的速度和可靠性。在大多数情况下,SendInput 近似于瞬间发生的,即使是在发送长字符串时。由于 SendInput 如此快速,它也更可靠,因为将给其他一些窗口更少的机会来出乎意料地弹出并截断键击。可靠性更优是凭借用户在一个 SendInput 期间键入的任何东西将被延期到之后的事实来讲的。

和其他发送模式不同,操作系统限制 SendInput 为大约 5000 字符 (这会随操作系统的版本和性能设置不同而改变)。字符和事件超出这个限制的将不发送。

注意: SendInput 忽略 SetKeyDelay 因为操作系统在这个模式不支持一个延迟。不过,当 SendInput 在下面描述的条件下恢复为 SendEvent 时,它可用 SetKeyDelay -1, 0 (除非 SendEvent 的按键延迟是 "-1,-1" ,这种情况使用的是 "-1,-1" )。当 SendInput 恢复为 SendPlay ,它使用 SendPlay 的按键延迟。

如果除了那个执行 SendInput 的脚本,一个脚本安装了一个 low-level keyboard hook(底层键盘钩子),SendInput 自动恢复为 SendEvent (或者是 SendPlay ,如果 SendMode InputThenPlay 是生效的话)。这被恢复是因为一个外部的钩子的存在禁用了所有 SendInput 的优势,使它不如 SendPlay 和 SendEvent 两者。不过,由于 SendInput 不能在程序里探测到一个底层钩子除了 AutoHotkey v1.0.43+ ,它将不会恢复到那些情况,使它比 SendPlay/Event 的可靠性更低。

当 SendInput 通过例如 {Click} 的方式发送鼠标点击,并且 CoordMode Mouse, Relative 生效 (默认),每次点击都会相对于在发送开始时激活的那个窗口。因此,如果 SendInput故意地激活了另一个窗口 (通过例如 alt-tab 的方式),在同个命令里随后点击的坐标会是错误的,因为它们仍然相对于那个之前的窗口而不是这个新的窗口。

Windows 95 (和 NT4 SP3 之前): SendInput 不被支持并且会自动地恢复为 SendEvent (或者是 SendPlay ,如果 SendMode InputThenPlay 是生效的话)。

SendPlay [v1.0.43+]

SendPlay 较其他模式而言的最大优势是它的 "play back" 键击能力和在多种游戏里的鼠标点击。例如,某一特定的游戏可能仅在它们有 SendPlay option 时接受 hotstrings 。

在三个发送模式中,SendPlay 是最独特的,因为它自身不模拟键击和鼠标点击。取而代之的是,它创造一些列的事件 (消息) 直接地流向激活的窗口 (和 ControlSend 相似,但在一个更低的层面)。

和 SendInput 相似,SendPlay 的键击不会夹杂着用户输入的键击。因此,如果用户碰巧在一个 SendPlay 期间键入某些东西,那些键击会延期到之后。

虽然 SendPlay 比起 SendInput 来说是相当地慢,但它通常比传统的 SendEvent 模式(即使当 KeyDelay 是 -1 时) 更快。

SendPlay 不能触发调用两个 Windows 键(LWin 和 RWin) 的系统热键。例如,它不能显示开始菜单或使用 Win-R 来显示运行对话框。

如果安装了 键盘钩子 ,Windows 键(LWin 和 RWin) 在一个 SendPlay 期间会自动地被屏蔽。这防止在发送时用户意外地按到一个 Windows 键而显示开始菜单。相对而言, LWin 和 RWin 键之外的按键不需要被屏蔽,因为操作系统自动地延迟它们直到 SendPlay 之后 (通过缓存)。

SendPlay 不使用 SetKeyDelay 和 SetMouseDelay 的标准设置。它默认根本不延迟,但可以像下面的例子展示的那样被改变:

SetKeyDelay, 0, 10, Play  ; 注意 0 和 -1 在 SendPlay 模式里是一样的。
SetMouseDelay, 10, Play

SendPlay 不能开启或关闭 Capslock, Numlock 或 Scroll-lock 键。同样地,当 GetKeyState 获得一个按键的状态时它不能去改变,除非键击是发送到脚本自身的一个窗口。即使这样,左/右 修饰键(例如 RControl) 的任何改变能被探测到,仅通过它们的中性的相对键 (例如 Control)。同样,SendPlay 有其他一些在 SendMode 页面 描述到的限制。

与 SendInput 和 SendEvent 不同,用户可以通过按 Control-Alt-Del 或 Control-Escape 来打断一个 SendPlay 。当这发生时,剩余的键击将不被发送,但脚本会继续执行仿佛  SendPlay 已正常地完成了。

虽然 SendPlay 能发送 LWin 和 RWin 事件,但它们被直接地发送到激活的窗口而不是执行它们本来的操作系统功能。要绕弯解决它,使用 SendEvent 。例如,SendEvent #r 将显示开始菜单的运行对话框。

和 SendInput 不同,SendPlay 即使在 Windows 95 和 NT4 SP3之前也能使用。

相关页面

SendMode, SetKeyDelay, SetStoreCapslockMode, Escape sequences (e.g. `%) , ControlSend, BlockInput, Hotstrings, WinActivate

示例

Send Sincerely,{enter}John Smith  ; 键入一个两行的签名。
Send !fs ; 选择 File->Save 菜单项 (Alt+F 后跟 S)。
Send {End}+{Left 4} ; 跳至文本末尾然后发送四个 shift+左-箭头 键击。
SendInput {Raw}一系列未加工的字符通过最快的模式(SendInput) 发送。
翻译:天堂之门 menk33@163.com 2008年8月21日